% Created 2022-06-16 四 11:24
% Intended LaTeX compiler: xelatex
\documentclass[11pt]{article}
\usepackage{graphicx}
\usepackage{longtable}
\usepackage{wrapfig}
\usepackage{rotating}
\usepackage[normalem]{ulem}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{capt-of}
\usepackage{hyperref}
\usepackage{xeCJK}
\setmainfont{Times New Roman}
\setCJKmainfont{WenQuanYi Micro Hei Mono}
\setCJKmonofont{Sarasa Mono SC}
\setcounter{secnumdepth}{2}
\author{陈冠宇}
\date{\textit{<2022-06-16 四>}}
\title{函数的三维可视化\\\medskip
\large 学年设计答辩}
\hypersetup{
 pdfauthor={陈冠宇},
 pdftitle={函数的三维可视化},
 pdfkeywords={图形学, 函数},
 pdfsubject={答辩用PPT},
 pdfcreator={Emacs 28.1 (Org mode 9.6)}, 
 pdflang={Chinese}}
\begin{document}

\maketitle

\section{目录}
\label{sec:orgee0a099}
\subsection{目录}
\label{sec:orgf5ffee6}
\begin{itemize}
\item 需求分析
\label{sec:orgf9c5da9}
\item 功能细化
\label{sec:orgd49c5eb}
\item 开发环境
\label{sec:orge9e6088}
\item 参考文献
\label{sec:org892edd0}
\end{itemize}

\section{需求分析}
\label{sec:orge24ffc5}
\subsection{背景}
\label{sec:org47abf3c}
\begin{itemize}
\item 观察函数图形。

\item 理解函数性质。

\item MATLAB 收费，gnuplot 需要脚本。

\item 以上二者均不能简单实现鼠标拖动。

\item 学习图形学知识，结合编译原理。
\end{itemize}

\subsection{数据流}
\label{sec:org0c1b830}
\(\hfill\)

\(\hfill\)

\begin{figure}[htbp]
\centering
\includegraphics[width=0.38\textwidth]{./imgs/data-flow.png}
\caption{\label{fig: dataflow}数据流}
\end{figure}

\subsection{输入}
\label{sec:org5d81b03}
\begin{itemize}
\item 公式
\label{sec:orgf8de73d}
\begin{itemize}
\item 直角坐标 / 极坐标 / 参数方程
\end{itemize}
\item 公式辅助
\label{sec:org4cc865c}
\begin{itemize}
\item 常见函数列表 sin cos tan \ldots{}\ldots{}
\item 括号自动补全 按 Tab
\end{itemize}
\item 鼠标拖动
\label{sec:org18346e9}
\begin{itemize}
\item 绕屏幕 横轴 纵轴 旋转
\end{itemize}
\item 鼠标滚轮
\label{sec:org81fd539}
\begin{itemize}
\item 大小缩放
\end{itemize}
\end{itemize}

\section{功能细化}
\label{sec:orgfb1e46f}
\subsection{模块划分}
\label{sec:org3c1e845}

\begin{figure}[htbp]
\centering
\includegraphics[width=.9\linewidth]{./imgs/modules.png}
\caption{\label{fig: dataflow}模块划分}
\end{figure}

\begin{center} 公式编译、图形渲染、用户交互 \end{center}

\subsection{词法}
\label{sec:org765d506}

\begin{itemize}
\item \(\mathbf{String} \longrightarrow [a-zA-Z]+\)

\item \(\mathbf{Number} \longrightarrow [0-9]*(.[0-9]*)|e|pi\)

\item \(\mathbf{Operator} \longrightarrow [+-*/]\)

\item \(\mathbf{Builtin\_Func} \longrightarrow sin|cos|tan|arcsin|arccos|arctan|sec|csc|cot\)

\item \(\mathbf{Delimiter} \longrightarrow [,()]\)
\end{itemize}

\subsection{语素}
\label{sec:org394cf0e}

\begin{verbatim}
pub enum Expr {
    Csti, Cstf, Var, // 常数 变量
    Add, Sub, // 加减
    Mul, Div,// 乘除
    Pow, Log, // 指数对数
    Sin, Cos, Tan, // 三角函数
    ArcSin, ArcCos, ArcTan, // 反三角函数
    Sec, Csc, Cot, // 三角函数
    Neg, // 负号
    Funcall, // 弃用 函数调用 因为不一定能求导
    Bra, Ket, // 左右括号
    Comma, // 逗号
}
\end{verbatim}

\subsection{语法}
\label{sec:org183fecf}

$\hfill$

$\mathbf{Expression} \longrightarrow - \emph{Expression}$

$\qquad\mid \emph{Primary\ expr}$

$\mathbf{Primary\ expr}\longrightarrow \emph{Number}$

$\qquad\mid \emph{String}$

$\qquad\mid \emph{Funcall}$

$\qquad\mid(\emph{Expression})$

$\mathbf{Power\ expr} \longrightarrow  \emph{ Primary\ expr }$

$\qquad\mid \emph{Primary\ expr}\ ^\land \ \emph{Expression}$

$\mathbf{Multiplicative\ expr} \longrightarrow \emph{Factorial\ expr}$

$\qquad\mid \emph{Factorial\ expr}\ *\ \emph{Factorial\ expr}$

$\qquad\mid \emph{Factorial\ expr}\ /\ \emph{Factorial\ expr}$

$\mathbf{Additive\ expr} \longrightarrow \emph{Multiplicative\ expr}$

$\qquad\mid \emph{Multiplicative\ expr}\ +\ \emph{Multiplicative\ expr}$

$\qquad\mid \emph{Multiplicative\ expr}\ -\ \emph{Multiplicative\ expr}$

\subsection{求值}
\label{sec:org07b39b3}
\begin{itemize}
\item 维护符号表
\item 叶节点替换为浮点数
\item 中间节点替换为计算过后的浮点数
\item 求导：递归 模式匹配与语法树替换
\end{itemize}

\begin{figure}[htbp]
\centering
\includegraphics[width=0.38\textwidth]{./imgs/eval.png}
\caption{\label{fig:one_plus_two}1+2}
\end{figure}

\subsection{图形渲染}
\label{sec:orgb1e3110}
\begin{itemize}
\item 打点
\label{sec:orgfc9d436}
每个参数固定间隔，计算函数表达式的值。
比如 \(z=x+y\) 取 \(\{(x, y) | x,y\in S, S\subsetneqq \mathbb{Q}\}\)

\item 片元
\label{sec:org502f44b}
\begin{itemize}
\item 直角坐标：因打点间隔固定，有正方形，沿着 \(y=x\) 分成两个三角形。
\item 极坐标：用三角函数投影到直角坐标。
\item 参数方程：离散的每一个点原地扩张成小三角形，以至于肉眼看来是点。
\end{itemize}

\item 着色
\label{sec:orgbf95e4e}
记录 z 的最值，固定间隔从蓝到红渐变。 在弹出窗口展示图形。
\end{itemize}
\subsection{直角坐标渲染}
\label{sec:orgedd71fc}
\begin{figure}[htbp]
\centering
\includegraphics[width=0.75\textwidth]{imgs/render.png}
\caption{\label{fig:render}\(z=x^2+y^2\)}
\end{figure}

\subsection{参数方程渲染}
\label{sec:orgeaa7f60}
\begin{figure}[htbp]
\centering
\includegraphics[width=0.75\textwidth]{imgs/para_func.png}
\caption{\label{fig:render}\(z=t,x=\cos(t),y=\sin(t)\)}
\end{figure}

\subsection{用户界面}
\label{sec:org0282d29}
\begin{figure}[htbp]
\centering
\includegraphics[width=.9\linewidth]{imgs/tui-face.png}
\caption{\label{fig:TUI}TUI 界面}
\end{figure}
\begin{itemize}
\item \texttt{h} 浮窗展示所有快捷键
\end{itemize}

\section{总结致谢}
\label{sec:org3b0a7c4}
\subsection{总结}
\label{sec:org107a95b}
\begin{itemize}
\item 工程
\label{sec:org6073f7b}
\begin{itemize}
\item 编译原理与图形学的简单结合
\end{itemize}

\item 优点
\label{sec:orgac6d308}
\begin{itemize}
\item 不需要学习新脚本，免费，所见即所得
\end{itemize}

\item 不足
\label{sec:org740e543}
\begin{itemize}
\item 没有实现赋值表达式，人为限制软件复杂度
\item 变量范围有限，因为求值时散点的数量可能溢出，没有采用大整数类
\end{itemize}
\end{itemize}

\subsection{开发环境}
\label{sec:org40c1fb3}
\begin{itemize}
\item 支持 Vulkan 的 GPU
\label{sec:org4441e6f}
Vulkan 是新一代计算机图形接口，自由程度更高，资源消耗更少。

\item Arch Linux（Kernel 5.18.2）
\label{sec:org2863a3f}
本软件在 Linux 上编译；交叉工具链可以跨平台。

\item Rust
\label{sec:orgf9a3e94}
内存安全的编程语言，支持函数式编程；无需运行时支持和垃圾回收，性能媲美 C++。
\end{itemize}

\subsection{参考文献}
\label{sec:orgc938692}

\begin{enumerate}
\item \href{https://github.com/vulkano-rs/vulkano}{\texttt{Vulkano-rs}, https://github.com/vulkano-rs/vulkano}

\item \href{https://vulkan-tutorial.com/}{\texttt{Vulkan tutorial}, https://vulkan-tutorial.com/}

\item \href{https://games-cn.org/intro-graphics/}{\texttt{Games101}, https://games-cn.org/intro-graphics/}
\end{enumerate}
\end{document}
